using System.Collections.Generic;
using FixMath;
using UniFramework.Actor;
using UnityEngine;

namespace UniFramework.Battle
{
	/// <summary>
	/// 配置项
	/// </summary>
	public class BulletConfig
	{
		public string id;
		public string prefabName;
		public GameObject bulletPrefab;
		public FixInt radius; //碰撞半径
		public int cnaHitCnt = 1; //可以碰撞的次数
		public FixInt sameTargetDelayCheck; //碰撞同一个目标的延迟
		public int deleteHp = 1;//扣血数量
		public bool hitEnemy; //是否会命中敌人
		public bool hitFriendly; //是否会命中友军
		public BulletOnCreate onCreate;
		public BulletOnHit onHit;
		public BulletOnRemoved onRemoved;
		public Dictionary<string, object> parameters; //额外参数标记
	}

	///<summary>
	///子弹被创建的事件
	///</summary>
	public delegate void BulletOnCreate(LogicBullet bullet);

	/// <summary>
	/// 弹命中目标的时候触发的事件
	/// </summary>
	public delegate void BulletOnHit(LogicBullet bullet, LogicObject target);

	///<summary>
	///子弹在生命周期消耗殆尽之后发生的事件，生命周期消耗殆尽是因为BulletState.duration<=0，或者是因为移动撞到了阻挡。
	///<param name="bullet">发生碰撞的子弹，应该是个bulletObj，但是在unity的逻辑下，他就是个GameObject，具体数据从GameObject拿了</param>
	///</summary>
	public delegate void BulletOnRemoved(LogicBullet bullet);

	///<summary>
	///子弹的轨迹函数，传入一个时间点，返回出一个Vector3，作为这个时间点的速度和方向，这是个相对于正在飞行的方向的一个偏移（*speed的）
	///正在飞行的方向按照z轴，来算，也就是说，当你只需要子弹匀速行动的时候，你可以让这个函数只做一件事情——return Vector3.forward。
	///<param name="t">子弹飞行了多久的时间点，单位秒。</param>
	///<param name="bullet">是当前的子弹GameObject，不建议公式中用到这个</param>
	///<return>返回这一时间点上的速度和偏移，Vector3就是正常速度正常前进</return>
	///</summary>
	public delegate FixIntVector3 BulletTween(float t, LogicObject bullet, LogicObject target);

	///<summary>
	///子弹在发射瞬间，可以捕捉一个GameObject作为目标，并且将这个目标传递给BulletTween，作为移动参数
	///<param name="bullet">是当前的子弹GameObject，不建议公式中用到这个</param>
	///<param name="targets">所有可以被选作目标的对象，这里是GameManager的逻辑决定的传递过来谁，比如这个游戏子弹只能捕捉角色作为对象，那就是只有角色的GameObject，当然如果需要，加入子弹也不麻烦</param>
	///<return>在创建子弹的瞬间，根据这个函数获得一个GameObject作为followingTarget</return>
	///</summary>
	public delegate LogicActor BulletTargetingFunction(LogicBullet bullet, LogicObject[] targets);
}